package com.empire.module.member.dal.mysql.location;

import java.util.*;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.empire.framework.common.pojo.PageResult;
import com.empire.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.empire.framework.mybatis.core.mapper.BaseMapperX;
import com.empire.framework.mybatis.core.query.QueryWrapperX;
import com.empire.module.member.dal.dataobject.location.LocationDO;
import org.apache.ibatis.annotations.Mapper;
import com.empire.module.member.controller.admin.location.vo.*;

/**
 * 定位信息 Mapper
 *
 * @author 主席大人
 */
@Mapper
public interface LocationMapper extends BaseMapperX<LocationDO> {

    default PageResult<LocationDO> selectPage(LocationPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<LocationDO>()
                .betweenIfPresent(LocationDO::getCreateTime, reqVO.getCreateTime())
                .betweenIfPresent(LocationDO::getLocationTime, reqVO.getLocationTime())
                .eqIfPresent(LocationDO::getPersonId, reqVO.getPersonId())
                .eqIfPresent(LocationDO::getLng, reqVO.getLng())
                .eqIfPresent(LocationDO::getLat, reqVO.getLat())
                .eqIfPresent(LocationDO::getAddress, reqVO.getAddress())
                .eqIfPresent(LocationDO::getDataType, reqVO.getDataType())
                .eqIfPresent(LocationDO::getCameraNo, reqVO.getCameraNo())
                .eqIfPresent(LocationDO::getFaceUrl, reqVO.getFaceUrl())
                .orderByDesc(LocationDO::getLocationTime));
    }

    /**
     * 查询指定人员出现次数最多的地址
     *
     * @param personId 人员ID
     * @return 包含地址和出现次数的Map集合，按出现次数降序排列
     */
    default List<Map<String, Object>> selectMostFrequentAddress(Long personId, Integer limit) {
        // 使用QueryWrapperX而非LambdaQueryWrapperX，更适合处理原生SQL
        return selectMaps(new QueryWrapperX<LocationDO>()
                .eq("person_id", personId)  // 直接使用数据库字段名
                .isNotNull("address")
                .groupBy("address")
                .select("address, COUNT(*) AS appearance_count")  // 原生SQL字段选择
                .orderByDesc("appearance_count")
                .last("LIMIT " + limit)
        );
    }

    /**
     * 查询指定人员的常去地（包含次数、首次/末次时间、经纬度）
     *
     * @param personId 人员ID
     * @param limit    返回条数限制
     * @return 常去地统计结果列表
     */
    default List<Map<String, Object>> selectFrequentLocations(Long personId, Integer limit) {
        // 使用QueryWrapper构造查询条件
        return selectMaps(new QueryWrapper<LocationDO>()
                .eq("person_id", personId) // 筛选指定人员
                .isNotNull("address") // 排除空地址
                .groupBy("address") // 按地址分组
                // 统计所需字段：地址、次数、首次时间、末次时间、平均经纬度（用于定位）
                .select(
                        "address",
                        "COUNT(*) AS count", // 出现次数
                        "MIN(location_time) AS firstTime", // 首次出现时间
                        "MAX(location_time) AS lastTime", // 末次出现时间
                        "AVG(lng) AS lng", // 平均经度（地址可能对应多个经纬度时取平均）
                        "AVG(lat) AS lat"  // 平均纬度
                )
                .orderByDesc("count") // 按出现次数降序
                .last("LIMIT " + limit) // 限制返回条数
        );
    }


}